package com.huanf.controller;

import com.huanf.service.AsyncService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.boot.CommandLineRunner;
import org.springframework.web.bind.annotation.RestController;

import java.util.Objects;
import java.util.concurrent.CompletableFuture;

/**
 * @author: 35238
 * 功能: 异步调用。注意重新启动的时候，要先重新启动provider模块，再重新启动consumer模块
 * 时间: 2023-12-30 13:00
 */
@RestController
public class AsyncController implements CommandLineRunner {

    @DubboReference(timeout = 5000)//由于AsyncServiceImpl的方法限制了3秒后才能被调用，所以我们这里的超时时间要设置大于3秒，不然comsumer模块运行报错
    private AsyncService asyncService;

    //由于是测试异步调用，所以我们用CommandLineRunner在程序启动时就运行这个run方法。注意不是一直调用，这里只调用一次，也就是只输出一次
    @Override
    public void run(String... args) {
        CompletableFuture<String> result = asyncService.sayHello("李四");
        result.whenComplete((value,error)->{
            if(Objects.nonNull(error)) {
                System.out.println("出错了");
                error.printStackTrace();
            }
            System.out.println("我是comsumer模块，我异步调用了provider模块的sayHello方法，拿到的值是:  => "+value);
        });
    }
}